#include "bsp_clk.h"

//开所有外设时钟
void clk_Init()
{ 
     CCM->CCGR0=0xFFFFFFFF;
     CCM->CCGR1=0xFFFFFFFF;
     CCM->CCGR2=0xFFFFFFFF;
     CCM->CCGR3=0xFFFFFFFF;
     CCM->CCGR4=0xFFFFFFFF;
     CCM->CCGR5=0xFFFFFFFF;
     CCM->CCGR6=0xFFFFFFFF;
}

//792MHZ时钟频率
void imx6ull_clock_init()
{
     //先初始化为792MHZ主频，这款不是512MHZ
     //先将主频换成晶振 24 MHZ          CCSR-pll1_sw_clk_sel位设置为1，然后CCSR的step_sel设置为0
     CCM->CCSR |= 1<<2;                 //位2是pll1_sw_clk_sel
     CCM->CCSR &= ~(1<<8);         //位8是step_sel
     //计算792MHZ  公式为：792=24*DIV_SEL/2，可得出DIV_SEL=66
     CCM_ANALOG->PLL_ARM =  0; 
     CCM_ANALOG->PLL_ARM &= ~(0x7F); 
     CCM_ANALOG->PLL_ARM |= 66;
     CCM_ANALOG->PLL_ARM |=(1<<13);
     //配置分频为1分频                  CACRR的ARM_PODF位配置
     CCM->CACRR &= ~(7<<0);        //低三位清0，代表1分频
     //此处切换回配置好的主频
     CCM->CCSR &= ~(1<<2);        //位2是pll1_sw_clk_sel
     CCM->CCSR |= 1<<8;               //位8是step_sel


     uint32_t reg=0;
     /* 2、设置 PLL2(SYS PLL)各个 PFD */ 
     reg = CCM_ANALOG->PFD_528; 
     reg &= ~(0X3F3F3F3F); /* 清除原来的设置 */ 
     reg |= 32<<24; /* PLL2_PFD3=528*18/32=297Mhz */ 
     reg |= 24<<16; /* PLL2_PFD2=528*18/24=396Mhz */ 
     reg |= 16<<8; /* PLL2_PFD1=528*18/16=594Mhz */ 
     reg |= 27<<0; /* PLL2_PFD0=528*18/27=352Mhz */ 
     CCM_ANALOG->PFD_528=reg; /* 设置 PLL2_PFD0~3 */ 
     //  //PFD2 :x=396   FRAC=24，经测试DDR3卡死的原因：频繁修改PFD_528寄存器，莫名其妙的BUG
     // CCM_ANALOG->PFD_528 &= ~((0x3F)<<16);
     // CCM_ANALOG->PFD_528 |=   24<<16;           

     /* 3、设置 PLL3(USB1)各个 PFD */ 
     reg = 0; /* 清零 */ 
     reg = CCM_ANALOG->PFD_480; 
     reg &= ~(0X3F3F3F3F); /* 清除原来的设置 */ 
     reg |= 19<<24; /* PLL3_PFD3=480*18/19=454.74Mhz */ 
     reg |= 17<<16; /* PLL3_PFD2=480*18/17=508.24Mhz */ 
     reg |= 16<<8; /* PLL3_PFD1=480*18/16=540Mhz */ 
     reg |= 12<<0; /* PLL3_PFD0=480*18/12=720Mhz */ 
     CCM_ANALOG->PFD_480=reg; /* 设置 PLL3_PFD0~3 */ 

      /* 4、设置 AHB 时钟 最小 6Mhz， 最大 132Mhz */ 
     CCM->CBCMR &= ~(3 << 18); /* 清除设置*/ 
     CCM->CBCMR |= (1 << 18); /* pre_periph_clk=PLL2_PFD2=396MHz */ 
     CCM->CBCDR &= ~(1 << 25); /* periph_clk=pre_periph_clk=396MHz */ 
     while(CCM->CDHIPR & (1 << 5));/* 等待握手完成 */

     /*IPG_CLK_ROOT 最小 3Mhz，最大 66Mhz ,默认是AHB的2分频66，不需要改*/
     /*默认值复位生效但是内核的ROM BOOT会设置一遍寄存器，此时寄存器值不一定是复位值，必须手动设置*/
     CCM->CBCDR &= ~(3 << 8); /* CBCDR 的 IPG_PODF 清零 */ 
     CCM->CBCDR |= 1 << 8; /* IPG_PODF 2 分频，IPG_CLK_ROOT=66MHz */

     /*设置 PERCLK_CLK_ROOT 时钟 ，默认1分频，默认来自AHB的2分频66，也不需要动*/
     CCM->CSCMR1 &= ~(1 << 6); /* PERCLK_CLK_ROOT 时钟源为 IPG */ 
     CCM->CSCMR1 &= ~(7 << 0); /* PERCLK_PODF 位清零，即 1 分频 */ 

     /*设置UART时钟为80MHZ*/
     //UART_CLK_SEL
     CCM->CSCDR1 &= ~(1<<6);
     //UART_CLK_PODF
     CCM->CSCDR1 &= ~(0x3F<<0);

}